<?php

namespace App\Http\Controllers;

use App\Models\Address;
use Illuminate\Http\Request;

class AddressController extends Controller
{
    public function index() {
        // $count = Address::where('active', 1)->count();
        // $max = Address::where('active', 1)->max('counts');
    }
    /**
     * 显示指定地址.
     *
     * @param  int  $id
     * @return View
     */
    public function show($id)
    {
        $address = Address::findOrFail($id);
        // pre($address);// App\Models\Address Object
        return view('address.profile', ['address' => $address]);

        // 通过主键查找一个模型...
        // $address = Address::find(1);
        // // $address->setDeleted(true);// 不能这么用。
        // $address->deleted= 1;
        // pre($address);// App\Models\Address Object

        // 查找符合查询条件的首个模型...
        // $address = Address::where('active', 1)->first();
        // pre($address);// App\Models\Address Object

        // 查找符合查询条件的首个模型的快速实现...
        // $address = Address::firstWhere('active', 1);
        // pre($address);// App\Models\Address Object

        // 存在则返回，不存在则将回调函数执行结果返回。
        // 1、存在
        // $address = Address::where('counts', '>', 100)->firstOr(function () {
        //     //
        // });
        // pre($address);// App\Models\Address Object
        // 2、不存在
        // $address2 = Address::where('counts', '>', 200)->firstOr(function () {
        //     return 123;
        // });
        // pre($address2);// 123

        // 指定查询的字段（['id', 'counts']）
        // $address = Address::where('counts', '>', 100)
        //     ->firstOr(['id', 'counts'], function () {
        //         // ...
        //     });
        // pre($address);// 数据里只有 id 和 counts 这两个字段，没有 name、status、create_time 等。

        // 查询不到则报错
        // 如果未找到，将抛出 Illuminate\Database\Eloquent\ModelNotFoundException 异常。
        // 如果没有捕获异常，则会自动返回 404 响应给用户。也就是说，使用这些方法时，没有必要再写个检查来返回 404 响应。
        // 1、
        // $address = Address::findOrFail($id);
        // // pre($address);// App\Models\Address Object
        // return view('address.profile', ['address' => $address]);
        // 2、
        // $address = Address::where('counts', '>', 100)->firstOrFail();
        // 3、web.php 中直接使用
        // Route::get('/api/address/{id}', function ($id) {
        //     return Address::findOrFail($id);
        // });
    }

    // 查询所有
    // public function all11()
    // {
    //     $addresses = Address::all();
    //     return $addresses;

    //     print_r($addresses);
    //     return;
    //     // foreach ($addresses as $address) {
    //     //     echo $address->name;
    //     // }
    // }

    public function list()
    {
        // $addresses = Address::all();
        // pre($addresses);exit;
        /*
        Illuminate\Database\Eloquent\Collection Object
        (
            [items:protected] => Array
                (
                    [0] => App\Models\Address Object
         */
        /*
        $data = [];
        foreach ($addresses as $address) {
            // echo $address->name;
            array_push($data, [
                'id' => $address->id,
                'parent_id' => $address->parent_id,
                'name' => $address->name,
                'create_time' => $address->create_time,
                'update_time' => $address->update_time,
                'delete_time' => $address->delete_time
            ]);
        }
        */
        // pre($data);
        // 如果使用 ['addresses' => $data]，那么 模板 中就不能 $address->，因为它不是对象。

        // return view('address.list', ['addresses' => $addresses]);

        //条件查询一组（已经被软删除的不会被查询到）
        $addresses = Address::where('active', 1)
            ->orderBy('id', 'desc')
            ->take(10)
            ->get();
        pre($addresses);
        /*
        Illuminate\Database\Eloquent\Collection Object
            (
                [items:protected] => Array
                    (
         */

        // 查询已经被软删除的数据中符合条件的数据
        // $addresses = Address::onlyTrashed()
        //     ->where('active', 1)
        //     ->orderBy('id', 'desc')
        //     ->take(10)
        //     ->get();
        // pre($addresses);

        // 查询所有数据中符合条件的数据
        // $addresses = Address::withTrashed()
        //     ->where('active', 1)
        //     ->orderBy('id', 'desc')
        //     ->take(10)
        //     ->get();
        // pre($addresses);
    }

    // 不要直接打印 $request，东西很多。
    // Symfony\Component\ErrorHandler\Error\FatalError:
    // Allowed memory size of 134217728 bytes exhausted (tried to allocate 67112960 bytes)
    public function add(Request $request)
    {
        // ini_set('memory_limit', '256M');
        // pre($request->name);
        $address = new Address;
        $address->name = $request->name;
        $res = $address->save();
        // vr($res);// boolean(true)


        // return view('address.profile', ['address' => Address::findOrFail($id)]);
    }

    public function update(Request $request)
    {
        // 先查找后更新
        $address = Address::find($request->id);
        $address->active = $request->active;
        $res = $address->save();
        // vr($res);// boolean(true)。
        // 重复执行
        // （1）不会真实执行 sql。因为发现 update_time 字段的值不变。
        // （2）虽然看起来没有执行，但 $res 还是 boolean(true)。

        // return view('address.profile', ['address' => Address::findOrFail($id)]);
    }

    public function delete($id)
    {
        // $address = Address::find($id);
        // $res = $address->delete();
        // vr($res);// bool(true)

        // 批量删除
        // Address::destroy(1);
        // Address::destroy(1, 2, 3);
        // Address::destroy([1, 2, 3]);
        // Address::destroy(collect([1, 2, 3]));

        // 真实 软删除 2条
        // $res = Address::destroy(2, 3);
        // vr($res);// int(2)

        // 因为 2和3之前已经软删除了，所以这次只软删除了 4 这一条数据。
        // $res = Address::destroy(2, 3, 4);
        // vr($res);// int(1)

        // 恢复
        // 恢复所有软删除的数据
        // Address::withTrashed()->restore();
        // 恢复一条已经删除的数据
        // $address = Address::withTrashed()->find(2);
        // pre($address);
        // $address->restore();

        // return view('address.profile', ['address' => Address::findOrFail($id)]);
    }
}
